﻿using System;
using JTLeigh.Commerce.Spencer.Features.ProductFeedback.Common.Entities;

namespace JTLeigh.Commerce.Spencer.Features.ProductFeedback.Data.Providers
{

	/// <summary>
	/// Provider used to retrieve product feedback metadata, including rating attributes, 
	/// recommendation attributes, and review attributes, from the database.
	/// </summary>
	public interface IProductFeedbackMetadataProvider
	{

		#region Methods

		/// <summary>
		/// Gets all product feedback metadata from the database.
		/// </summary>
		/// <param name="tenantId">The tenant identifier <see cref="Guid"/> of the tenant whose
		/// metadata is to be retrieved.</param>
		/// <returns>A <see cref="ProductFeedbackMetadata"/> containing all rating attributes,
		/// recommendation attributes, review attributes, etc.</returns>
		ProductFeedbackMetadata GetProductFeedbackMetadata(Guid tenantId);

        /// <summary>
        /// Gets all of the associations and disassociations of the specified product to and from 
        /// product feedback badges.
        /// </summary>
        /// <param name="tenantId">The tenant identifier <see cref="Guid"/> of the tenant whose
        /// relations are to be retrieved.</param>
        /// <param name="catalogId">The catalog identifier <see cref="String"/> of the catalog
        /// that the product whose relations are to be retrieved is in.</param>
        /// <param name="productId">The product identifier <see cref="String"/> of the product 
        /// whose relations are to be retrieved.</param>
        /// <returns>A <see cref="ProductFeedbackBadgeProductRelations"/> object.</returns>
        ProductFeedbackBadgeProductRelations GetProductFeedbackBadgeProductRelations(Guid tenantId, string catalogId, string productId);

        /// <summary>
        /// Gets all of the associations and disassociations of the specified category to and from 
        /// product feedback badges.
        /// </summary>
        /// <param name="tenantId">The tenant identifier <see cref="Guid"/> of the tenant whose
        /// relations are to be retrieved.</param>
        /// <param name="catalogId">The catalog identifier <see cref="String"/> of the catalog
        /// that the category whose relations are to be retrieved is in.</param>
        /// <param name="categoryId">The category identifier <see cref="String"/> of the category 
        /// whose relations are to be retrieved.</param>
        /// <returns>A <see cref="ProductFeedbackBadgeCategoryRelations"/> object.</returns>
        ProductFeedbackBadgeCategoryRelations GetProductFeedbackBadgeCategoryRelations(Guid tenantId, string catalogId, string categoryId);

        /// <summary>
		/// Gets all of the associations and disassociations of the specified product to and from 
		/// product rating attributes.
		/// </summary>
		/// <param name="tenantId">The tenant identifier <see cref="Guid"/> of the tenant whose
		/// relations are to be retrieved.</param>
        /// <param name="catalogId">The catalog identifier <see cref="String"/> of the catalog
        /// that the product whose relations are to be retrieved is in.</param>
        /// <param name="productId">The product identifier <see cref="String"/> of the product 
		/// whose relations are to be retrieved.</param>
		/// <returns>A <see cref="ProductRatingAttributeProductRelations"/> object.</returns>
		ProductRatingAttributeProductRelations GetProductRatingAttributeProductRelations(Guid tenantId, string catalogId, string productId);

		/// <summary>
		/// Gets all of the associations and disassociations of the specified category to and from 
		/// product rating attributes.
		/// </summary>
		/// <param name="tenantId">The tenant identifier <see cref="Guid"/> of the tenant whose
		/// relations are to be retrieved.</param>
        /// <param name="catalogId">The catalog identifier <see cref="String"/> of the catalog
        /// that the category whose relations are to be retrieved is in.</param>
        /// <param name="categoryId">The category identifier <see cref="String"/> of the category 
		/// whose relations are to be retrieved.</param>
		/// <returns>A <see cref="ProductRatingAttributeCategoryRelations"/> object.</returns>
		ProductRatingAttributeCategoryRelations GetProductRatingAttributeCategoryRelations(Guid tenantId, string catalogId, string categoryId);

		/// <summary>
		/// Gets all of the associations and disassociations of the specified product to and from 
		/// product recommendation attributes.
		/// </summary>
		/// <param name="tenantId">The tenant identifier <see cref="Guid"/> of the tenant whose
		/// relations are to be retrieved.</param>
        /// <param name="catalogId">The catalog identifier <see cref="String"/> of the catalog
        /// that the product whose relations are to be retrieved is in.</param>
        /// <param name="productId">The product identifier <see cref="String"/> of the product 
		/// whose relations are to be retrieved.</param>
		/// <returns>A <see cref="ProductRecommendationAttributeProductRelations"/> object.</returns>
		ProductRecommendationAttributeProductRelations GetProductRecommendationAttributeProductRelations(Guid tenantId, string catalogId, string productId);

		/// <summary>
		/// Gets all of the associations and disassociations of the specified category to and from 
		/// product recommendation attributes.
		/// </summary>
		/// <param name="tenantId">The tenant identifier <see cref="Guid"/> of the tenant whose
		/// relations are to be retrieved.</param>
        /// <param name="catalogId">The catalog identifier <see cref="String"/> of the catalog
        /// that the category whose relations are to be retrieved is in.</param>
        /// <param name="categoryId">The category identifier <see cref="String"/> of the category 
		/// whose relations are to be retrieved.</param>
		/// <returns>A <see cref="ProductRecommendationAttributeCategoryRelations"/> object.</returns>
		ProductRecommendationAttributeCategoryRelations GetProductRecommendationAttributeCategoryRelations(Guid tenantId, string catalogId, string categoryId);

		/// <summary>
		/// Gets all of the associations and disassociations of the specified product to and from 
		/// product review attributes.
		/// </summary>
		/// <param name="tenantId">The tenant identifier <see cref="Guid"/> of the tenant whose
		/// relations are to be retrieved.</param>
        /// <param name="catalogId">The catalog identifier <see cref="String"/> of the catalog
        /// that the product whose relations are to be retrieved is in.</param>
        /// <param name="productId">The product identifier <see cref="String"/> of the product 
		/// whose relations are to be retrieved.</param>
		/// <returns>A <see cref="ProductReviewAttributeProductRelations"/> object.</returns>
		ProductReviewAttributeProductRelations GetProductReviewAttributeProductRelations(Guid tenantId, string catalogId, string productId);

		/// <summary>
		/// Gets all of the associations and disassociations of the specified category to and from 
		/// product review attributes.
		/// </summary>
		/// <param name="tenantId">The tenant identifier <see cref="Guid"/> of the tenant whose
		/// relations are to be retrieved.</param>
        /// <param name="catalogId">The catalog identifier <see cref="String"/> of the catalog
        /// that the category whose relations are to be retrieved is in.</param>
        /// <param name="categoryId">The category identifier <see cref="String"/> of the category 
		/// whose relations are to be retrieved.</param>
		/// <returns>A <see cref="ProductReviewAttributeCategoryRelations"/> object.</returns>
		ProductReviewAttributeCategoryRelations GetProductReviewAttributeCategoryRelations(Guid tenantId, string catalogId, string categoryId);

		#endregion // Methods

	}

}
